package com.uikoo9.manage.y.util;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKeyFactory;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created with IntelliJ IDEA.
 * User: shoko (fbjia.com)
 * Date: 13-5-27
 * Time: 上午11:10
 * To change this template use File | Settings | File Templates.
 */
public class StringUtil {
    public static final String EMPTY = "";

    public String toHtml(String _tag) {
        _tag = _tag.replaceAll("<","&lt;");
        _tag = _tag.replaceAll(">","&gt;");
        _tag = _tag.replaceAll(" ","&nbsp;");
        _tag = _tag.replaceAll("\"","&quot;");
//        _tag = _tag.replaceAll("\n","<br>");
//        _tag = _tag.replaceAll("\t", "&nbsp;&nbsp;");
//        _tag = _tag.replaceAll(",","&apos;");
//        _tag = _tag.replaceAll("&","&amp;");

        return "<br>code：<br>"+_tag+"<hr>";
    }

    public static String replace(String content,String reg,String torget){
        return content.replace(reg,torget);
    }

    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    public static String substringBefore(String str, String separator) {
        if (isEmpty(str) || separator == null) {
            return str;
        }
        if (separator.length() == 0) {
            return EMPTY;
        }
        int pos = str.indexOf(separator);
        if (pos == -1) {
            return str;
        }
        return str.substring(0, pos);
    }

    public static String substringAfterLast(String str, String separator) {
        if (isEmpty(str)) {
            return str;
        }
        if (isEmpty(separator)) {
            return EMPTY;
        }
        int pos = str.lastIndexOf(separator);
        if (pos == -1 || pos == (str.length() - separator.length())) {
            return EMPTY;
        }
        return str.substring(pos + separator.length());
    }

    /**
     *  str 截取到after 后面 出现第一个separator
     * @param str
     * @param separator
     * @param after
     * @return
     */
    public static String substringAfterTimes(String str, String separator,String after) {
        if (isEmpty(str)) {
            return str;
        }
        if (isEmpty(separator)) {
            return EMPTY;
        }
        int pos = str.indexOf(separator);
        if (pos == -1 || pos == (str.length() - separator.length())) {
            return EMPTY;
        }
        if(str.indexOf(after) == -1){
            return str;
        }
        return str.substring(0,str.indexOf(separator,str.indexOf(after)+after.length()));
    }

    /**
     * 首字母大写其他小写
     * @param str
     * @return
     */
    public static String toLowerCaseTheFristChar(String str){
        if(str!=null){
            return str.toUpperCase().substring(0, 1)+str.toLowerCase().substring(1);
        }else {
            return null;
        }
    }

    /**
     * 首字母大写其他小写
     * @param str
     * @return
     */
    public static String toLowerCaseTwoChar(String str){
        if(str!=null){
            return str.toUpperCase().substring(0, 2)+str.toLowerCase().substring(2);
        }else {
            return null;
        }
    }


    /**
     * 判断字符串是否超长
     *
     * @param s
     * @return true表示超长，false为否
     */
    public static boolean isOverLength(String s) {
        if (s == null || s.trim().length() <= GlobalConstant.TD_MAX_LENGTH)
            return Boolean.FALSE;
        return Boolean.TRUE;
    }

    /**
     * 获得超长字符串的省写格式
     *
     * @param s 超长的字符串
     * @return 省写格式
     */
    public static String getElideString(String s) {
        return s.trim().substring(0, GlobalConstant.TD_MAX_LENGTH - 2).concat(GlobalConstant.SUSPENSION_POINTS);
    }

    /**
     * List类型对象转换成String型,多个元素以,相隔
     *
     * @param list
     * @return String型
     */
    public static String formatListToString(java.util.List list) {
        if (list == null)
            return null;
        if (list.size() == 0)
            return GlobalConstant.STR_EMPTY;
        StringBuffer buffer = new StringBuffer();
        for (Object obj : list)
            buffer.append(GlobalConstant.COMMA).append(obj == null ? GlobalConstant.STR_EMPTY : obj.toString().trim());
        if (buffer.length() > 0)
            buffer.deleteCharAt(0);
        return buffer.toString();
    }

    /**
     * String型对象转换List类型，中间以regex相隔
     *
     * @param s
     * @param regex 分隔符号,默认为,
     * @return List类型
     */
    public static java.util.List<String> formatStringToList(String s, String regex) {
        java.util.List<String> rstList = new java.util.ArrayList<String>();
        if (isStrEmpty(regex))
            regex = GlobalConstant.COMMA;
        if (isStrEmpty(s))
            return rstList;
        String[] array = s.split(regex);
        for (String str : array)
            rstList.add(str);
        return rstList;
    }

    /**
     * String型对象转换List类型，中间以,相隔
     *
     * @param s
     * @return List类型
     */
    public static java.util.List<String> formatStringToListByComma(String s) {
        java.util.List<String> rstList = new java.util.ArrayList<String>();
        getListElementByString(rstList, s);
        return rstList;
    }

    private static void getListElementByString(java.util.List list, String s) {
        if (isStrEmpty(s))
            list.add(GlobalConstant.STR_EMPTY);
        else if (s.indexOf(GlobalConstant.COMMA) == -1) {
            list.add(s);
        } else {
            String temp = s.substring(0, s.indexOf(GlobalConstant.COMMA));
            list.add(isStrEmpty(temp) ? GlobalConstant.STR_EMPTY : temp);
            getListElementByString(list, s.substring(s.indexOf(GlobalConstant.COMMA) + 1));
        }
    }

    /**
     * 方法名称：从字符串中剪切掉某字符后剩余字符
     * 方法编号:200001
     *
     * @param str1 --源字符串
     *             str2 --需剪切字符串
     * @return --剪切掉某字符后剩余字符
     */
    public static String getTrimedStringBySpilth(String str1, String str2) {
        StringBuffer rst = new StringBuffer();
        java.util.List l = stringToArrayList(str1, GlobalConstant.COMMA);
        while (l.contains(str2)) {
            l.remove(str2);
        }
        int v = l.size();
        for (int i = 0; i < v; i++) {
            rst.append(l.get(i)).append(GlobalConstant.COMMA);
        }
        return getTrimedStringByComma(rst.toString()).toString();
    }

    /**
     * 方法名称：从字符串中剪切掉某字符后剩余字符
     * 方法编号:200001-1
     *
     * @param str1 --源字符串
     *             str2 --需剪切字符串
     * @return --剪切掉某字符后剩余字符
     */
    public static StringBuffer getTrimedStringBufferBySpilth(StringBuffer str1, String str2) {
        return new StringBuffer(getTrimedStringBySpilth(str1.toString(), str2));
    }

    /**
     * 方法名称：从字符串中剪切掉连续重复某字符后的剩余字符
     * 方法编号:200002
     *
     * @param str1 --源字符串
     *             str2 --重复字符串
     *             str --剪切结果
     * @return --剪切掉某字符后剩余字符
     */

    public static String getTrimedStringByRepeatedStr(String str1, String str2, StringBuffer str) {
        String rst = GlobalConstant.STR_EMPTY;
        if (str1 != null && str2 != null) {
            int l = str2.length();
            int k = str1.length();
            int m = str1.indexOf(str2);
            String str3 = new String();
            if (k > m + 2 * l)
                str3 = str1.substring(m + l, m + 2 * l);
            if (m > 0) {
                if (str3.equals(str2)) {
                    str.append(str1.substring(0, m + l));
                    str1 = str1.substring(m + l, k);
                } else {
                    str.append(str1.substring(0, m + l)).append(str3);
                    if (m + l + 1 <= k)
                        str1 = str1.substring(m + l, k);
                    else
                        str1 = GlobalConstant.STR_EMPTY;
                }
                return getTrimedStringByRepeatedStr(str1, str2, str);
            } else if (m == 0) {
                if (str3.equals(str2)) {
                    str1 = str1.substring(m + l, k);
                    if (str.length() == 0) {
                        str.append(str2);
                    } else if (!(str.lastIndexOf(str2) == str.length() - l))
                        str.append(str2);
                } else if (str.lastIndexOf(str2) == str.length() - l) {
                    str1 = str1.substring(m + l, k);
                } else {
                    str.append(str2).append(str3);
                    str1 = str1.substring(m + l, k);
                }
                return getTrimedStringByRepeatedStr(str1, str2, str);
            }
            str.append(str1);
        }
        if (str != null)
            rst = str.toString();
        return rst;
    }

    /**
     * 方法名称：去除字符前后,号
     * 方法编号:200003
     *
     * @param str1 --源字符串
     * @return --去除字符前后,号的字符
     */
    public static StringBuffer getTrimedStringByComma(String str1) {
        StringBuffer rst = new StringBuffer();
        if (str1 != null) {
            int j = str1.indexOf(GlobalConstant.COMMA);
            if (j == 0)
                str1 = str1.substring(1, str1.length());
            j = str1.lastIndexOf(GlobalConstant.COMMA);
            if (j == str1.length() - 1 && str1.length() - 1 >= 0)
                str1 = str1.substring(0, str1.length() - 1);
            rst.append(str1);
        }
        return rst;
    }

    /**
     * 方法名称：比较2个字符的差异
     * 方法编号:200005
     *
     * @param str1 --字符1
     *             Str2 --字符2
     * @return --0-字符2比字符1少的字符
     *         1-字符2比字符1多的字符
     */
    public static java.util.List compareList(String str1, String str2) {
        java.util.List rst = new java.util.ArrayList();
        if (str1 != null && (str1.equals(GlobalConstant.STR_NULL) || str1.equals(GlobalConstant.STR_EMPTY)))
            str1 = null;
        if (str2 != null && (str2.equals(GlobalConstant.STR_NULL) || str2.equals(GlobalConstant.STR_EMPTY)))
            str2 = null;
        if (str1 == null) {
            rst.add(null);
            rst.add(str2);
        } else if (str2 == null) {
            rst.add(str1);
            rst.add(null);
        } else {
            StringBuffer rst0 = new StringBuffer();
            StringBuffer rst1 = new StringBuffer();
            java.util.List lst1 = stringToArrayList(str1, GlobalConstant.COMMA);
            java.util.List lst2 = stringToArrayList(str2, GlobalConstant.COMMA);
            int j = lst1.size();
            for (int i = 0; i < j; i++) {
                String s = ((String) lst1.get(i)).trim();
                if (!lst2.contains(s)) {
                    rst0.append(s).append(GlobalConstant.COMMA);
                }
            }
            j = lst2.size();
            for (int i = 0; i < j; i++) {
                String s = ((String) lst2.get(i)).trim();
                if (!lst1.contains(s)) {
                    rst1.append(s).append(GlobalConstant.COMMA);
                }
            }
            rst0 = getTrimedStringByComma(rst0.toString());
            rst1 = getTrimedStringByComma(rst1.toString());
            if (rst0.length() == 0)
                rst.add(null);
            else
                rst.add(rst0.toString());

            if (rst1.length() == 0)
                rst.add(null);
            else
                rst.add(rst1.toString());
        }
        return rst;
    }

    /**
     * 通过文件名判断是unix或linux系统
     *
     * @param fileName 文件名
     * @return
     * @author kevin
     * @date 2005-6-30
     */
    public static boolean isUnixOS(String fileName) {
        // unix系统的文件名的第一个字符是"/";
        if (!isStrEmpty(fileName)) {
            String separator = fileName.substring(0, 1);
            if ("/".equals(separator))
                return true;
            else
                return false;
        } else
            return false;
    }

    public static String getRandomLengthNum(int length) {
        StringBuffer str = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            str.append(java.lang.Math.abs(random.nextInt(10)));
        }
        return str.toString();
    }

    /**
     * 判断str是否为空
     *
     * @param str String
     * @return boolean true:空;false:非空
     * @author:kevin
     * @date:2004-12-22
     */
    public static boolean isStrEmpty(String str) {
        return ((str == null) || (str.equals(GlobalConstant.STR_EMPTY)));
    }

    public static boolean isStrTrimEmpty(String str) {
        return (str == null) || (str.trim().equals(GlobalConstant.STR_EMPTY));
    }

    public static boolean notStrTrimEmpty(Object str) {
        return (str != null) && !(str.toString().trim().equals(GlobalConstant.STR_EMPTY));
    }

    public static boolean notNull(Object str) {
        return (str != null) ;
    }

    /**
     * 把字符串按格式转化为List
     * author: ray
     *
     * @param str
     * @param delim
     * @return
     */
    public static java.util.List stringToArrayList(String str, String delim) {
        java.util.List list = new java.util.ArrayList();
        if (!isStrEmpty(str) && delim != null) {
            if (str.endsWith(delim)) {
                str = str.substring(0, str.length() - 1);
            }
            int index = str.indexOf(delim);
            if (index == -1) {
                list.add(str);
                return list;
            }
            while (index != -1) {
                String temp = str.substring(0, index);
                if (temp != null) {
                    if (temp.equals(delim)) {
                        list.add(null);
                        index = index - delim.length();
                    } else
                        list.add(temp);
                    str = str.substring(index + 1);
                    index = str.indexOf(delim);
                } else
                    index++;
            }
            list.add(str.trim());
        }
        return list;
    }

    /**
     * @param input :
     *              输入的中文字符串，需要经过转换
     * @return 返回经过字符集转换的字符串
     */
    public static String parseChinese(String input)
            throws UnsupportedEncodingException {
        if (input == null || input.equals(GlobalConstant.STR_EMPTY))
            return (GlobalConstant.STR_EMPTY);
        byte[] temp = null;
        try {
            temp = input.getBytes(GlobalConstant.ENG_CODE_PAGE);
        } catch (UnsupportedEncodingException e) {
            throw new UnsupportedEncodingException(e.getMessage());
        }
        if (temp == null) {
            return (GlobalConstant.STR_EMPTY);
        } else {
            return (new String(temp, GlobalConstant.CN_CODE_PAGE));
        }
    }

    /**
     * 把String按分隔符号转换成String[]
     *
     * @param str
     * @param delim
     * @return
     */
    public static String[] stringToStringArray(String str, String delim) {
        java.util.List list = stringToArrayList(str, delim);
        Object[] objectStr = list.toArray();
        int len = objectStr.length;
        String[] strAarray = new String[len];
        java.lang.System.arraycopy(objectStr, 0, strAarray, 0, len);
        return strAarray;
    }

    /**
     * 比较2个字符的差异，并将差异部分分别返回
     *
     * @param oStr
     * @param nStr
     * @return rst0--String-- oStr差异部分
     *         rst1--String-- nStr差异部分
     */
    public static java.util.List compareString(String oStr, String nStr) {
        java.util.List rst = new java.util.ArrayList();
        StringBuffer rst0 = new StringBuffer();
        StringBuffer rst1 = new StringBuffer();
        if (oStr != null && nStr != null) {
            java.util.List ol = stringToArrayList(oStr, GlobalConstant.COMMA);
            java.util.List nl = stringToArrayList(nStr, GlobalConstant.COMMA);
            int ov = ol.size();
            int nv = nl.size();
            //去除空格
            if (oStr.indexOf(" ") >= 0) {
                for (int i = 0; i < ov; i++) {
                    String s = (String) ol.get(i);
                    s = s.trim();
                    ol.set(i, s);
                }
            }
            //去除空格
            if (nStr.indexOf(" ") >= 0) {
                for (int i = 0; i < nv; i++) {
                    String s = (String) nl.get(i);
                    s = s.trim();
                    nl.set(i, s);
                }
            }
            for (int i = 0; i < ol.size(); i++) {
                String s = (String) ol.get(i);
                if (nl.contains(s)) {
                    nl.remove(s);
                    ol.remove(s);
                    i--;
                } else
                    rst0.append(s).append(GlobalConstant.COMMA);
            }
            for (int i = 0; i < nl.size(); i++) {
                String s = (String) nl.get(i);
                rst1.append(s).append(GlobalConstant.COMMA);
            }
            rst0 = getTrimedStringByComma(rst0.toString());
            rst1 = getTrimedStringByComma(rst1.toString());
        }
        rst.add(rst0.toString());
        rst.add(rst1.toString());
        return rst;
    }

    public static String getDcolumnString(java.util.List fieldList) {
        StringBuffer rst = new StringBuffer();
        int fv = fieldList.size();
        for (int i = 0; i < fv; i++) {
            String field = (String) fieldList.get(i);
            rst.append(field + " AS F" + i);
            if (i < fv - 1)
                rst.append(GlobalConstant.COMMA);
        }
        return rst.toString();
    }

    public static String getRandomNumAndChar(int length) {
        String rst = GlobalConstant.STR_EMPTY;
        Random random = new Random();
        String str1 = "0123456789";//包含数字的字符串
        String str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";//包含字母的字符串
        int start1 = random.nextInt(str1.length());//取str1长度范围内的随机值
        int start2 = random.nextInt(str2.length());
        String c1 = str1.substring(start1, start1 + 1);//截取字符串的一个随机字符
        String c2 = str2.substring(start2, start2 + 1);

        //再用个循环拼接下，length（密码长度）从全局参数中取
        for (int i = 0; i < length; i++) {
            start1 = random.nextInt(str1.length());
            start2 = random.nextInt(str2.length());
            c1 = str1.substring(start1, start1 + 1);
            c2 = str2.substring(start2, start2 + 1);
            rst += c1;
            if (rst.length() >= length)
                break;
            rst += c2;
            if (rst.length() >= length)
                break;
        }
        return rst;
    }

    /**
     * 获取修改后的字符
     *
     * @return
     */
    public static String getEditedStr(String s) {
        StringBuffer rst = new StringBuffer();
        java.util.List l = stringToArrayList(s, GlobalConstant.COMMA);
        int v = l.size();
        String temp = null;
        for (int i = 0; i < v; i++) {
            temp = (String) l.get(i);
            if (temp.indexOf(GlobalConstant.STR_NULL) < 0 && !temp.endsWith("=") && temp.indexOf("=未知") <= 0)
                rst.append(temp).append(GlobalConstant.COMMA);
        }
        rst = getTrimedStringByComma(rst.toString());
        return rst.toString();
    }

    public static Map stringToMap(String s, String s1, String s2) {
        java.util.List prsList = stringToArrayList(s, s1);
        Map map = null;
        int v = prsList.size();
        if (v > 0) {
            map = new HashMap();
            String t = null;
            int index = 0;
            for (int i = 0; i < v; i++) {
                t = (String) prsList.get(i);
                index = t.indexOf(s2);
                map.put(t.substring(0, index), t.substring(index + 1, t.length()));
            }
        }
        return map;
    }

    /**
     * String[]转换成String
     *
     * @param array String数组
     * @return null或字符串(多个元素以, 相隔)
     */
    public static String formateStringArrayToString(String[] array) {
        if (array == null)
            return null;
        if (array.length == 0)
            return null;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; i++) {
            sb.append("," + array[i]);
        }
        return sb.substring(1);
    }

    /**
     * 得到Object的String值
     *
     * @param obj
     * @return String值
     */
    public static String valueOf(Object obj) {
        return obj == null ? "" : String.valueOf(obj);
    }

    /**
     * 得到Object的String值
     *
     * @param obj
     * @return String值
     */
    public static String trimValueOf(Object obj) {
        return obj == null ? "" : String.valueOf(obj).trim();
    }

    /**
     * 判断String数组是否包含指定String
     *
     * @param array 指定的String数组
     * @param s     指定的String
     * @return 包含则返回True，反之则返回false
     */
    public static boolean hasContain(String[] array, String s) {
        if (isStrEmpty(s))
            return Boolean.FALSE;
        if (array == null || array.length == 0)
            return Boolean.FALSE;
        for (String e : array) {
            if (s.equals(e))
                return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    /**
     * 解析高级查询组件的条件字符串，得到List
     *
     * @param aqConditions 高级查询组件的条件字符传，格式为：大类ID#小类ID#操作符号ID#值#值类型&...&大类ID#小类ID#操作符号ID#值#值类型
     * @return 元素为String[5]的List (String[0]-maxClass, String[1]-minClass, String[2]-option, String[3]-value, String[4]-valueType)
     */
    public static java.util.List parseAdvancedQueryConditon(String aqConditions) {
        java.util.List sqlCondtionList = new java.util.ArrayList();
        if (isStrEmpty(aqConditions))
            return sqlCondtionList;
        String[] conditionArray = aqConditions.split(GlobalConstant.AND);//条件数组，一个元素表示一个条件
        String[] columnArray = null;
        int i = 0;
        for (i = 0; i < conditionArray.length; i++) {
            columnArray = conditionArray[i].split(GlobalConstant.WELL);
            if (columnArray.length != 5)
                continue;
            sqlCondtionList.add(columnArray);
        }
        conditionArray = null;
        columnArray = null;
        i = 0;
        return sqlCondtionList;
    }

    /**
     * 格式化高级查询组件的条件字符串
     *
     * @param array String[0]-maxClass, String[1]-minClass, String[2]-option, String[3]-value, String[4]-valueType
     * @return
     */
    public static void formatAdvancedQueryConditon(String[] array) {
        if (Integer.parseInt(array[4]) == 0) {//简单字符
            if (array[2].indexOf("IN") != -1)
                array[3] = (" ('").concat(array[3]).concat("') ");
            else if (array[2].indexOf("LIKE") != -1)
                array[3] = (" '%").concat(array[3]).concat("%' ");
            else
                array[3] = (" '").concat(array[3]).concat("' ");
        } else {
            if (array[2].indexOf("IN") != -1)
                array[3] = (" (").concat(array[3]).concat(") ");
            else if (array[2].indexOf("LIKE") != -1)
                array[3] = (" '%").concat(array[3]).concat("%' ");
            else
                array[3] = (" ").concat(array[3]).concat(" ");
        }
        array[2] = (" ").concat(array[2]).concat(" ");
    }

    /**
     * 字符串内容分析，分析数字的格式化字符串，得到"."后的小数位长度
     *
     * @param parseStyle 字符串格式
     * @return pasreStyleLen 返回“.”以后的字符串长度
     */
    private static int parseStyles(String parseStyle) {
        int parseStyleLen = 0;
        try {
            int index = parseStyle.lastIndexOf(".");
            parseStyleLen = parseStyle.substring(index + 1).length();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return parseStyleLen;
    }

    /**
     * 格式化数字字符串，保留两位小数
     *
     * @param strNumber
     * @return
     */
    public static String holdDoubleDigit(String strNumber) {
        String strTemp = "";
        if (isStrEmpty(strNumber))
            return strTemp;
        if (strNumber.substring(strNumber.length() - 1).equals(GlobalConstant.PERCENTSIGN)) {
            strTemp = parseDec(strNumber.substring(0, strNumber.length() - 1));
            strTemp = strTemp.concat(GlobalConstant.PERCENTSIGN);
        } else {
            strTemp = parseDec(strNumber);
        }
        return strTemp;
    }

    /**
     * 格式化字符串：若为金钱，则格式化成"#,###,###.00"；若为小于1的小数，则不变。
     *
     * @param strMoney
     * @return
     */
    public static String formatMoneyString(String strMoney) {
        if (isStrEmpty(strMoney))
            return strMoney;
        if (strMoney.indexOf(GlobalConstant.COMMA) != -1)
            return strMoney;
        if (ValidateUtil.doubleValidate(strMoney.trim())) {
            strMoney = strMoney.trim();
            if (strMoney.indexOf(GlobalConstant.SPOT) != -1 && strMoney.indexOf(GlobalConstant.SPOT) == strMoney.lastIndexOf(GlobalConstant.SPOT)) {
                if (Double.parseDouble(strMoney) < 1d)
                    return strMoney;
                return parseDec(strMoney);
            } else
                return strMoney;
        } else {
            return strMoney;
        }
    }

    /**
     * 格式化数字字符串,默认格式:##,###,###.00
     *
     * @param strNumber 数字字符串
     * @return 格式后的字符串
     */
    public static String parseDec(String strNumber) {
        return parseDec(strNumber, null);
    }

    /**
     * 格式化数字字符串,默认格式:##,###,###.00
     *
     * @param dec        数字字符串
     * @param parseStyle 格式
     * @return 格式后的字符串
     */
    public static String parseDec(String dec, String parseStyle) {
        String newObj = "";
        java.text.DecimalFormat df = null;
        try {
            if (isStrEmpty(dec)) {
                newObj = "";
            } else if (!dec.equals("0")) {
                if (isStrEmpty(parseStyle))
                    parseStyle = "##,###,###.00";
                // 如果正数大于1或者负数小于1，则根据传入的格式格式化数字
                if (java.lang.Float.parseFloat(dec) >= 1 || java.lang.Float.parseFloat(dec) <= -1) {
                    df = new java.text.DecimalFormat(parseStyle);
                } else {
                    int parseLen = parseStyles(parseStyle);
                    StringBuffer parses = new StringBuffer("0.");
                    for (int i = 0; i < parseLen; i++) {
                        parses.append("0");
                    }
                    df = new java.text.DecimalFormat(parses.toString());
                }
                // 此处不能用Float，否则小数为0；必须用Double或者Long
                // 但是Long有可能长度不够
                newObj = df.format(new Double(dec));
            } else {
                newObj = "0.00";
            }

        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        return newObj;
    }

    /**
     * String[][]转换成String
     * int index
     *
     * @param array String数组
     * @return null或字符串(多个元素以, 相隔)
     */
    public static String stringArrayToString(java.util.List array, int index) {
        if (array == null)
            return null;
        if (array.size() == 0)
            return null;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.size(); i++) {
            String[][] str = (String[][]) array.get(i);
            sb.append("," + str[0][index]);
        }
        return sb.substring(1);
    }

    public static boolean isEmpty(java.util.List list) {
        boolean isEmpty = Boolean.TRUE;
        if (list == null || list.isEmpty())
            return isEmpty;
        for (Object o : list) {
            if (o != null && !StringUtil.isStrEmpty(o.toString())) {
                isEmpty = Boolean.FALSE;
                break;
            }
        }
        return isEmpty;
    }

    /**
     * 判断是否only展示
     *
     * @param disabled
     * @return true表示只展示不修改
     */
    public static boolean isOnlyDisplay(String disabled) {
        if ("disabled".equals(disabled) || "yes".equals(disabled) || "true".equals(disabled))
            return Boolean.TRUE;
        return Boolean.FALSE;
    }

    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("^(-?[0-9]?[.]?[0-9]+)$");
        if (isStrEmpty(str)) {
            return false;
        } else {
            Matcher isNum = pattern.matcher(str);
            if (!isNum.matches()) {
                return false;
            }
        }
        return true;
    }


    /**
     * 返回四位指标Code，如：0001
     *
     * @param code
     * @return
     */
    public static String getIndicatorCode(int code) {
        return String.format("%04d", code);
    }

    public static String specialCharReplace(String paraValue) {
        String typeXOne[] = new String[]{"1、", "2、", "3、", "4、", "5、", "6、", "7、", "8、", "9、", "10、", "11、", "12、", "13、", "14、", "15、", "16、", "17、", "18、", "19、", "20、"};
        String typeDone[] = new String[]{"一、", "二、", "三、", "四、", "五、", "六、", "七、", "八、", "九、", "十、", "十一、", "十二、", "十三、", "十四、", "十五、", "十六、", "十七、", "十八、", "十九、", "二十、"};
        String typeDKOne[] = new String[]{"（一）", "（二）", "（三）", "（四）", "（五）", "（六）", "（七）", "（八）", "（九）", "（十）", "（十一）", "（十二）", "（十三）", "（十四）", "（十五）", "（十六）", "（十七）", "（十八）", "（十九）", "（二十）"};
        String typeXDOne[] = new String[]{"1．", "2．", "3．", "4．", "5．", "6．", "7．", "8．", "9．", "10．", "11．", "12．", "13．", "14．", "15．", "16．", "17．", "18．", "19．", "20．"};
        String typeDKXOne[] = new String[]{"（1）", "（2）", "（3）", "（4）", "（5）", "（6）", "（7）", "（8）", "（9）", "（10）", "（11）", "（12）", "（13）", "（14）", "（15）", "（16）", "（17）", "（18）", "（19）", "（20）"};
        if (paraValue.indexOf("、") != -1) {
            for (int i = 0; i < typeXOne.length; i++) {
                paraValue = paraValue.replace(typeXOne[i], "");
            }
            for (int i = 0; i < typeDone.length; i++) {
                paraValue = paraValue.replace(typeDone[i], "");
            }
        }
        if (paraValue.indexOf("（") != -1) {
            for (int i = 0; i < typeDKOne.length; i++) {
                paraValue = paraValue.replace(typeDKOne[i], "");
            }
            for (int i = 0; i < typeDKXOne.length; i++) {
                paraValue = paraValue.replace(typeDKXOne[i], "");
            }
        }
        if (paraValue.indexOf("．") != -1) {
            for (int i = 0; i < typeXDOne.length; i++) {
                paraValue = paraValue.replace(typeXDOne[i], "");
            }
        }
        return paraValue;
    }

    /**
     * 处理下载文件名称
     *
     * @param fileName
     * @return
     * @throws java.io.UnsupportedEncodingException
     *
     */
    public static String encodeFileName(String fileName) throws UnsupportedEncodingException {
        // 1 如果长度超出，截取前17个
        // fileName.getBytes("gb2312"), "iso8859-1")
        String prefix = fileName.substring(0, fileName.lastIndexOf('.'));
        String suffix = fileName.substring(fileName.lastIndexOf('.'));
        byte[] bytes = fileName.getBytes("gb2312");
        String encoded = new String(bytes, "iso8859-1");
        return encoded;
    }

    public static String replaceSpecialChar(String str) {
        if (null == str || str.trim().equals("")) {
            return "nulltitle";
        }
        return str.replace("\\/", "").replace("<", "").replace(">", "").replace(":", "").replace("?", "").replace("|", "").replace("\"", "").replace("*", "");
    }

    /**
     * 从指定Map中获取指定Key的 值，并将期值转为String型，若Map中指定Key不存在，则直接返回默认值
     *
     * @param map          Map
     * @param key          Key
     * @param defaultValue 默认值
     * @return 将Map值转换后的Integer值，若不存在则返回默认值
     */
    public static String convertMapKeyToString(Map<String, String> map, String key, String defaultValue) {
        if (map.containsKey(key))
            return map.get(key);
        else
            return defaultValue;
    }

    /**
     * 从指定Map中获取指定Key的值，并将期值转为Integer型，若Map中指定Key不存在，则直接返回0
     *
     * @param map Map
     * @param key Key
     * @return 将Map值转换后的Integer值，若不存在则返回0
     */
    public static String convertMapKeyToInt(Map<String, String> map, String key) {
        return convertMapKeyToString(map, key, "");
    }

    /**
     * 将传入的对象转换为字符串，当传入的对象为null时返回默认值
     *
     * @param o
     * @param dv
     * @return
     */
    public static String safeToString(Object o, String dv) {
        String r = dv;
        if (o != null) {
            r = String.valueOf(o);
        }
        return r;
    }

    /**
     * 加密
     *
     * @param str 字符串
     * @return
     */
    public static String encrypt(String str, String keystr) {
        String _result = null;
        // 添加新安全算法 , 如果用 JCE 就要把它添加进去
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        String algorithm = "DES";
        try {
            // 生成密钥
            javax.crypto.spec.DESKeySpec kds = new javax.crypto.spec.DESKeySpec(hex2byte(keystr));
            javax.crypto.SecretKey deskey = SecretKeyFactory.getInstance(algorithm).generateSecret(kds);
            // 加密
            Cipher c1 = Cipher.getInstance(algorithm);
            c1.init(Cipher.ENCRYPT_MODE, deskey);
            byte[] cipherByte = c1.doFinal(str.getBytes());
            _result = byte2hex(cipherByte);
        } catch (Exception e1) {
        }
        return _result;
    }

    /**
     * 解密
     *
     * @param str 字符串
     * @return
     */
    public static String decrypt(String str, String keystr) {
        String _result = null;
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        String algorithm = "DES"; // 定义 加密算法 , 可用 DES,DESede,Blowfish
        // 解密
        byte[] cipherByte = hex2byte(str);
        try {
            javax.crypto.spec.DESKeySpec kds = new javax.crypto.spec.DESKeySpec(hex2byte(keystr));
            javax.crypto.SecretKey deskey = SecretKeyFactory.getInstance(algorithm).generateSecret(kds);
            Cipher c1 = Cipher.getInstance(algorithm);
            c1.init(Cipher.DECRYPT_MODE, deskey);
            byte[] clearByte = c1.doFinal(cipherByte);
            _result = new String(clearByte);
        } catch (Exception e1) {
        }

        return _result;
    }

    public static String byte2hex(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1)
                hs = hs + "0" + stmp;
            else
                hs = hs + stmp;
        }
        return hs;
    }

    public static byte[] hex2byte(String str) { // 字符串转二进制
        if (str == null)
            return null;
        str = str.trim();
        int len = str.length();
        if (len == 0 || len % 2 == 1)
            return null;
        byte[] b = new byte[len / 2];
        try {
            for (int i = 0; i < str.length(); i += 2) {
                b[i / 2] = (byte) Integer
                        .decode("0x" + str.substring(i, i + 2)).intValue();
            }
            return b;
        } catch (Exception e) {
            return null;
        }
    }

    public static String genKey() {
        String _result = null;
        // 生成密钥
        KeyGenerator keygen = null;
        try {
            keygen = KeyGenerator.getInstance("DES");
            javax.crypto.SecretKey deskey = keygen.generateKey();
            _result = byte2hex(deskey.getEncoded());
        } catch (java.security.NoSuchAlgorithmException e) {
            //e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        return _result;
    }

    /**
     * 转半角的函数(DBC case)
     * 任意字符串
     * 半角字符串
     * 全角空格为12288，半角空格为32
     * 其他字符半角(33-126)与全角(65281-65374)的对应关系是：均相差65248
     *
     * @param input
     * @return
     */
    public static String ToDBC(String input) {
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == 12288) {
                c[i] = (char) 32;
                continue;
            }
            if (c[i] > 65280 && c[i] < 65375) {
                c[i] = (char) (c[i] - 65248);
            }
        }
        return new String(c);
    }

    public static String escapeHtml(String o) {
        return o == null ? "" : o.replace(">", "&gt;").replace(" ", "&nbsp;").replace("<", "&lt;").replace("\n", "<br/>");
    }

    /**
     * 替换变量。变量是用${...}表示
     *
     * @param str  字符串
     * @param data 数据
     * @return
     */
    public static String replaceVariables(String str, Map data) {
        StringBuffer sb = new StringBuffer();
        if (isStrEmpty(str)) {
            int k = 0;
            int j = 0;
            int i = str.indexOf("${");
            while (i >= 0 && j >= 0) {
                sb.append(str.substring(j, i));

                j = str.indexOf("}", i);
                if (j > 0) {
                    String name = str.substring(i + 2, j);
                    if (data.containsKey(name)) {
                        sb.append(safeToString(data.get(name), ""));
                    } else {
                        sb.append("");
                    }
                    i = str.indexOf("${", j + 1);
                    k = j + 1;
                    j++;
                }
            }
            sb.append(str.substring(k, str.length()));
        }
        return sb.toString();
    }

    /**
     * 根据条件，截取字符串
     *
     * @param string 目标字符串
     * @param type   截取方式
     * @param length 截取长度
     * @return 截取的字符串
     */
    public static String subStringByLengthAndType(String string, int type, int length) {
        return subStringByLengthAndType(string, type, length, 0);
    }

    /**
     * 根据条件，截取字符串
     *
     * @param string 目标字符串
     * @param type   截取方式
     * @param length 截取长度
     * @param start  截取起点
     * @return 截取的字符串
     */
    public static String subStringByLengthAndType(String string, int type, int length, int start) {
        StringBuffer _string = new StringBuffer();
        int _length = 0;
        if (type == 0) { //普通截取
            if (start + length >= string.length()) {
                return string.substring(start);
            } else {
                return string.substring(start, start + length);
            }
        } else if (type == 1) { //中文计算2长度截取
            for (int i = start; i < string.length() && _length < length; i++) {
                if (string.charAt(i) >= 0x7F) {
                    _length += 2;
                } else {
                    _length++;
                }
                if (length >= _length) {
                    _string.append(string.charAt(i));
                }
            }
        }
        return _string.toString();
    }

    /**
     * 根据统计方式，获取字符串长度
     *
     * @param string 目标字符创
     * @param type   0为普通方式，1为中文计算两个长度方式
     * @return 字符串长度
     */
    public static int getStringLengthByType(String string, int type) {
        int _length = 0;
        if (type == 0) {
            return string.length();
        } else if (type == 1) {
            for (int i = 0; i < string.length(); i++) {
                if (string.charAt(i) >= 0x7F) {
                    _length += 2;
                } else {
                    _length++;
                }
            }
        }
        return _length;
    }

    /**
     * 格式化文件大小
     *
     * @param size
     * @return
     */
    public static String formatFileSize(double size) {
        String[] rank = {"B", "K", "M", "G"};
        int c = 0;
        while (size > 1024) {
            size = size / 1024.0;
            c++;
        }
        java.text.DecimalFormat df = new java.text.DecimalFormat("0.00");
        String result = df.format(size) + (c > rank.length ? rank[rank.length - 1] : rank[c]);

        return result;
    }

    /**
     * 关键字搜索
     * 检查输入文本text中是否含有keywordList中的关键字
     * 返回的List含有搜索到得关键字，未搜索到则返回size为0的List
     *
     * @param text
     * @param keywordList
     * @return 返回的List含有搜索到得关键字，未搜索到则返回size为0的List
     */
    public static java.util.List<String> search(String text, java.util.List<String> keywordList) {
        java.util.List<String> retList = new java.util.ArrayList<String>();
        if (text == null || "".equals(text)) {
            return retList;
        }

        if (keywordList == null || keywordList.isEmpty()) {
            return retList;
        }

        for (String keyword : keywordList) {
            if (keyword == null || "".equals(keyword)) {
                continue;
            }
            if (text.indexOf(keyword) != -1) {
                retList.add(keyword);
            }
        }

        return retList;
    }

    /**
     * 关键字搜索
     * 检查输入文本text中是否含有keywordList中的关键字
     * 返回值中含有搜索到得关键字,以逗号分割，未搜索到则返回null
     *
     * @param text
     * @param keywordList
     * @return 返回值中含有搜索到得关键字, 以逗号分割，未搜索到则返回null
     */
    public static String searchRetString(String text, java.util.List<String> keywordList) {
//        List<String> list = search(text, keywordList);
//        if(list.isEmpty()) {
//            return null;
//        }
//
//        StringBuilder sb = new StringBuilder();
//        for(String s : list) {
//            if(sb.length() == 0) {
//                sb.append(s);
//            } else {
//                sb.append(",").append(s);
//            }
//        }
//
//        return sb.toString();


        if (text == null || "".equals(text)) {
            return null;
        }

        if (keywordList == null || keywordList.isEmpty()) {
            return null;
        }

        StringBuilder sb = new StringBuilder();
        for (String keyword : keywordList) {
            if (keyword == null || "".equals(keyword)) {
                continue;
            }
            if (text.indexOf(keyword) != -1) {
                if (sb.length() == 0) {
                    sb.append(keyword);
                } else {
                    sb.append(",").append(keyword);
                }
            }
        }
        //System.out.println("searchRetString: " + sb.toString() + sb.length());
        return sb.length() == 0 ? null : sb.toString();
    }

    /**
     * 替换字符串中HTML标签
     * @param str 字符串
     * @return
     */
    public static String replaceHtml(String str) {
        String pattern1 = "<(.[^>]*)>";
        return str.replaceAll(pattern1, "");
    }


}
